package com.example.linearlayoutdemo.network.fun.viewmodel;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.example.linearlayoutdemo.network.fun.model.UserListResponse;
import com.example.linearlayoutdemo.network.fun.repository.UserRepository;
import com.example.linearlayoutdemo.network.auth.utils.SharedPreferencesUtil; // 本地存储 Token

public class UserlistViewModel extends ViewModel implements UserRepository.RepositoryCallback<UserListResponse> {
    // 1. ViewModel 持有 LiveData（管理 UI 状态：加载中/成功/失败）
    private final MutableLiveData<Resource<UserListResponse>> userListLiveData = new MutableLiveData<>();
    // 2. ViewModel 持有 Repository 实例（依赖注入，解耦，便于测试）
    private final UserRepository userRepository;

    // 构造方法：初始化 Repository（外部可传入测试用 Repository，方便单元测试）
    public UserlistViewModel(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // 无参构造：默认使用真实 Repository（方便 Activity 调用）
    public UserlistViewModel() {
        this(new UserRepository());
    }

    /**
     * 对外暴露：触发获取用户列表（View 层调用此方法）
     */
    public void loadUserList() {
        // 1. 发送请求前：更新 LiveData 为“加载中”状态
        userListLiveData.setValue(Resource.loading(null));

        // 2. 从本地获取 Token（判断是否已登录）
        String token = SharedPreferencesUtil.getInstance(null).getUser().getToken();
        if (token.isEmpty()) {
            // 3. Token 为空：直接更新 LiveData 为“失败”状态
            userListLiveData.setValue(Resource.error("请先登录", null));
            return;
        }

        // 4. 调用 Repository 获取数据（传入当前 ViewModel 作为回调）
        userRepository.fetchUserList("Bearer " + token, this);
    }

    /**
     * 对外暴露：供 View 层观察的 LiveData（返回不可变的 LiveData，防止 View 层修改）
     */
    public MutableLiveData<Resource<UserListResponse>> observeUserList() {
        return userListLiveData;
    }

    // ------------------------------
    // RepositoryCallback 实现（处理 Repository 返回的结果）
    // ------------------------------
    @Override
    public void onSuccess(UserListResponse data) {
        // 数据获取成功：更新 LiveData 为“成功”状态，携带数据
        userListLiveData.setValue(Resource.success(data));
    }

    @Override
    public void onFailure(String errorMsg) {
        // 数据获取失败：更新 LiveData 为“失败”状态，携带错误信息
        userListLiveData.setValue(Resource.error(errorMsg, null));
    }
}
